#include<bits/stdc++.h>
using namespace std;
namespace IO{
    const int BUF=1<<21;
    char buff[BUF],*p1=buff,*p2=buff;
    #define gc() (p1==p2&&(p2=((p1=buff)+fread(buff,1,BUF,stdin)),p1==p2)?EOF:*p1++)
    template<typename T>inline void read(T &x){
        char ch=gc();x=0;int f=1;
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
        while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
        x*=f;
    }
    char obuf[BUF],*p3=obuf;
    inline void pc(char ch){
        if(p3-obuf<BUF) *p3++=ch;
        else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;
    }
    inline void put(const char *s){while(*s) pc(*s),++s;}
    char ch[32];int ctop;
    template<typename T>inline void print(T x){
    	if(x<0) x=~x+1,pc('-');
        if(!x) return pc(48);
        while(x) ch[++ctop]=x%10^48,x/=10;
        while(ctop) pc(ch[ctop--]);
    }
    inline void flush(){fwrite(obuf,p3-obuf,1,stdout);p3=obuf;}
}
using namespace IO;
const int N=2e5+5;
int head[N],to[N<<1],nxt[N<<1],w[N<<1],tot;
inline void add(int x,int y,int z){
	to[++tot]=y;
	nxt[tot]=head[x];
	w[tot]=z;
	head[x]=tot;
}
int n,q;
int dfn[N],idx,low[N],xl[20][N],st[20][N],lg[N],f[N],dis[N];
long long dep[N],lans;
void dfs(int p){
	xl[0][dfn[p]=++idx]=p;
	for(int o=head[p];o;o=nxt[o])
		if(to[o]!=f[p]){
			dep[to[o]]=dep[p]+w[o];
			dis[to[o]]=dis[p]+1;
			f[to[o]]=p;
			dfs(to[o]);
		}
	low[p]=idx;
}
inline int Min(int x,int y){return dis[x]<dis[y]?x:y;}
inline int Lca(int x,int y){
	if(!x||!y) return 0;
	if(x==y) return x;
	x=dfn[x],y=dfn[y];
	if(x>y) swap(x,y);
	int len=lg[y-x];
	return f[Min(xl[len][x+1],xl[len][y-(1<<len)+1])];
}
inline int query(int l,int r){
	int len=lg[r-l+1];
	return Min(st[len][l],st[len][r-(1<<len)+1]);
}
struct Tree{
	int ls,rs,cnt;
}t[N*20];
int root[N],ptot;
#define mid ((l+r)>>1)
void change(int &p,int l,int r,int x){
	t[++ptot]=t[p],++t[p=ptot].cnt;
	if(l<r){
		if(x<=mid) change(t[p].ls,l,mid,x);
		else change(t[p].rs,mid+1,r,x);
	}
}
int qpre(int x,int y,int l,int r,int rt){
	if(t[x].cnt==t[y].cnt) return 0;
	if(l==r) return xl[0][l];
	if(mid<rt){
		int pre=qpre(t[x].rs,t[y].rs,mid+1,r,rt);
		if(pre) return pre;
	}
	return qpre(t[x].ls,t[y].ls,l,mid,rt);
}
int qsuf(int x,int y,int l,int r,int lt){
	if(t[x].cnt==t[y].cnt) return 0;
	if(l==r) return xl[0][l];
	if(lt<=mid){
		int suf=qsuf(t[x].ls,t[y].ls,l,mid,lt);
		if(suf) return suf;
	}
	return qsuf(t[x].rs,t[y].rs,mid+1,r,lt);
}
int query(int x,int y,int l,int r,int lt,int rt){
	if(lt<=l&&r<=rt) return t[y].cnt-t[x].cnt;
	return (lt<=mid?query(t[x].ls,t[y].ls,l,mid,lt,rt):0)+(mid<rt?query(t[x].rs,t[y].rs,mid+1,r,lt,rt):0);
}
int main(){
	freopen("memory.in","r",stdin);
	freopen("memory.out","w",stdout);
	read(n),read(q);
	for(int i=1;i<n;++i){
		int x,y,z;
		read(x),read(y),read(z);
		add(x,y,z),add(y,x,z);
	}
	dfs(1);
	for(int i=2;i<=n;++i) lg[i]=lg[i>>1]+1;
	for(int j=1;j<20;++j)
	for(int i=1;i+(1<<j)-1<=n;++i) xl[j][i]=Min(xl[j-1][i],xl[j-1][i+(1<<(j-1))]);
	for(int i=1;i<n;++i) st[0][i]=Lca(i,i+1);
	for(int j=1;j<20;++j)
	for(int i=1;i+(1<<j)-1<=n;++i) st[j][i]=Min(st[j-1][i],st[j-1][i+(1<<(j-1))]);
	for(int i=1;i<=n;++i) change(root[i]=root[i-1],1,n,dfn[i]);
	while(q--){
		long long l,r,x;
		read(x),read(l),read(r);
		l^=lans,r^=lans,x^=lans;if(l>r||r>n||x>n) break;
		int cnt=query(root[l-1],root[r],1,n,dfn[x],low[x]);
		if(cnt!=0&&cnt!=r-l+1){
			lans=0;
		}else{
			int lca=(l==r?l:query(l,r-1));
			if(cnt==r-l+1){
				lans=dep[lca]-dep[x];
			}else if(dfn[lca]<=dfn[x]&&dfn[x]<=low[lca]){
				int pre=qpre(root[l-1],root[r],1,n,dfn[x]),suf=qsuf(root[l-1],root[r],1,n,dfn[x]);
				lans=dep[x]-max(dep[Lca(pre,x)],dep[Lca(suf,x)]);
			}else{
				lans=dep[x]+dep[lca]-dep[Lca(lca,x)]*2;
			}
		}
		print(lans),pc('\n');
	}
	flush();
	return 0;
}


